Prepare county level data

Read and format personality data


df_us_pers <- read_csv('timeseries_usa_county_march1_april_09.csv')

df_us_pers <- df_us_pers %>% select(countyfips, open, sci, extra, agree, stabil) %>% 
  mutate(stabil = 6-stabil) %>%
  dplyr::rename(county_fips = countyfips,
         pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = stabil) %>% 
  distinct() %>%
  mutate(county_fips = as.character(county_fips))

df_us_pers

Read and format prevalence data


df_us_prev <- read_csv('USA_timeseries_prep_2005.csv')

df_us_prev <- df_us_prev %>% 
  select(fips, date, rate) %>% 
  mutate(date = as.Date(date, "%d%b%Y")) %>% 
  rename(county_fips = fips, 
         rate_day = rate) %>%
  mutate(county_fips = as.character(county_fips))

df_us_prev
NA

Read and format county level controls


df_us_ctrl <- read.csv('controls_US.csv')

df_us_ctrl <- df_us_ctrl %>% select(-county_name) %>% 
  rename(county_fips = county) %>%
  mutate(county_fips = as.character(county_fips))

df_us_ctrl
NA

Read and format social distancing data FB


fb_files <- list.files('../FB Data/US individual files/Mobility/',
                       '*.csv', full.names = T)

df_us_socdist <- fb_files %>% 
  map(read_csv) %>% bind_rows()

df_us_socdist <- df_us_socdist %>%
  select(-age_bracket, -gender, -baseline_name, -baseline_type, -polygon_name) %>%
  rename(date = ds,
         county_fips = polygon_id,
         socdist_tiles = all_day_bing_tiles_visited_relative_change,
         socdist_single_tile = all_day_ratio_single_tile_users) %>%
  mutate(county_fips = as.character(county_fips))

df_us_socdist$date %>% summary()
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"2020-03-01" "2020-03-16" "2020-04-01" "2020-04-01" "2020-04-17" "2020-05-03" 

Merge data


# create sequence of dates
date_sequence <- seq.Date(min(df_us_prev$date),
                          max(df_us_prev$date), 1)
                     
# create data frame with time sequence
df_dates = data.frame(date_sequence, 1:length(date_sequence)) 
names(df_dates) <- c('date', 'time')

# join data frames 
df_us_prev <- df_us_prev %>%
  plyr::join(df_us_ctrl, by='county_fips') %>% 
  plyr::join(df_us_pers, by='county_fips') %>%
  merge(df_dates, by='date') %>% 
  arrange(county_fips, date)

df_us_prev

# create sequence of dates
date_sequence <- seq.Date(min(df_us_socdist$date),
                          as.Date('2020-04-28'), 1)
                     
# create data frame with time sequence
df_dates = data.frame(date_sequence, 1:length(date_sequence)) 
names(df_dates) <- c('date', 'time')

# join data frames 
df_us_socdist <- df_us_socdist %>%
  plyr::join(df_us_ctrl, by='county_fips') %>% 
  plyr::join(df_us_pers, by='county_fips') %>%
  inner_join(df_dates, by='date') %>% 
  arrange(county_fips, date)

fips_complete <- df_us_socdist %>% 
  group_by(county_fips) %>% 
  summarize(n = n()) %>% 
  filter(! n<max(n)) %>% .$county_fips

df_us_socdist <- df_us_socdist %>%
  filter(county_fips %in% fips_complete)

df_us_socdist

Control for weekend effect

Plot prevalence over time


df_us_prev %>% sample_n(20000) %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_us_prev %>% 
  mutate(prev_tail = cut(.[[i]], 
                         breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm=T), 
                                    quantile(.[[i]], 0.95, na.rm=T), Inf),
                         labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") + 
  ggtitle(i)

print(gg)
}

Plot social distancing single tile visited


df_us_socdist %>% sample_n(10000) %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_us_socdist %>% 
  mutate(dist_tail = cut(.[[i]], 
                         breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm = T), 
                                    quantile(.[[i]], 0.95, na.rm = T), Inf),
                         labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(dist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~dist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_us_socdist %>% sample_n(10000) %>%
  ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_us_socdist %>% 
  mutate(dist_tail = cut(.[[i]], 
                         breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm = T), 
                                    quantile(.[[i]], 0.95, na.rm = T), Inf),
                         labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(dist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_tiles)) + 
  geom_point(aes(col=county_fips, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~dist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_us_socdist <- df_us_socdist %>% 
  mutate(socdist_single_tile = socdist_single_tile_clean,
         socdist_tiles = socdist_tiles_clean) %>% 
  select(-loess, -loess_2, -socdist_single_tile_clean, -socdist_tiles_clean)

Correlations


df_us_prev %>% select(-time, -date) %>% 
  group_by(county_fips) %>%
  summarize_if(is.numeric, mean) %>% 
  select(-county_fips) %>%
  cor(use='pairwise.complete.obs') %>% 
  round(3) %>% as.data.frame()

df_us_socdist %>% select(-time, -date) %>% 
  group_by(county_fips) %>%
  summarize_if(is.numeric, mean) %>% 
  select(-county_fips) %>%
  cor(use='pairwise.complete.obs') %>% 
  round(3) %>% as.data.frame()
NA

Rescale Data


lvl2_scaled <- df_us_prev %>% 
  select(-time, -date, -rate_day) %>% 
  distinct() %>% 
  mutate_at(vars(-county_fips), scale)

lvl1_scaled <- df_us_prev %>% select(county_fips, time, rate_day)

df_us_prev_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips') 

lvl2_scaled <- df_us_socdist %>% 
  select(-time, -date, -socdist_tiles, -socdist_single_tile) %>% 
  distinct() %>% 
  mutate_at(vars(-county_fips), scale)

lvl1_scaled <- df_us_socdist %>% 
  select(county_fips, time, socdist_single_tile, socdist_tiles)

df_us_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips') 

Predict Prevalence

Extract first day of covid outbreak


# get onset day
df_us_onset_prev <- df_us_prev_scaled %>% 
  group_by(county_fips) %>% 
  mutate(rate_cs = cumsum(rate_day)) %>% 
  filter(rate_cs > 0) %>%
  summarize(onset_prev = min(time)) %>%
  mutate(county_fips = as.character(county_fips))
  
# merge with county data
df_us_onset_prev <- df_us_prev_scaled %>% 
  select(-time, -rate_day) %>%
  distinct() %>% 
  mutate(county_fips = as.character(county_fips)) %>%
  left_join(df_us_onset_prev, by = 'county_fips')

# handle censored data
df_us_onset_prev <- df_us_onset_prev %>% 
  mutate(event = ifelse(is.na(onset_prev), 0, 1)) %>% 
  mutate(onset_prev = replace_na(onset_prev, as.numeric(diff(range(df_us_prev$date)))+1))

Extract slopes


# cut time series before onset
df_us_prev_scaled <- df_us_prev_scaled %>% 
  group_by(county_fips) %>% 
  mutate(rate_cs = cumsum(rate_day)) %>% 
  filter(rate_cs > 0) %>%
  mutate(time = time-min(time)+1) %>%
  ungroup() %>%
  filter(time <= 30) %>%
  select(-rate_cs)

# drop counties with little data
df_us_prev_scaled <- df_us_prev_scaled %>%
  group_by(county_fips) %>%
  filter(n() == 30) %>%
  ungroup()

# extract slope prevalence
df_us_slope_prev <- df_us_prev_scaled %>% split(.$county_fips) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('county_fips') %>% 
  rename(slope_prev = '.')
  
# merge with county data
df_us_slope_prev <- df_us_prev_scaled %>% 
  select(-time, -rate_day) %>%
  distinct() %>% 
  inner_join(df_us_slope_prev, by = 'county_fips') %>%
  drop_na()

# handle censored data
df_us_slope_prev_cens <- df_us_slope_prev %>% 
  filter(slope_prev>=0) %>% 
  mutate(slope_prev = scale(slope_prev))

# standardize slopes
df_us_slope_prev <- df_us_slope_prev %>% 
  mutate(slope_prev = scale(slope_prev))

Explore distributions


df_us_onset_prev %>% ggplot(aes(onset_prev)) + geom_histogram(bins = 100)

df_us_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)

df_us_slope_prev_cens %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)

df_us_slope_prev %>% select(slope_prev) %>% summary()
    slope_prev.V1   
 Min.   :-0.437156  
 1st Qu.:-0.298897  
 Median :-0.216650  
 Mean   : 0.000000  
 3rd Qu.:-0.026712  
 Max.   :23.459218  
df_us_slope_prev_cens %>% select(slope_prev) %>% summary()
    slope_prev.V1   
 Min.   :-0.381258  
 1st Qu.:-0.300026  
 Median :-0.217861  
 Mean   : 0.000000  
 3rd Qu.:-0.029197  
 Max.   :23.334842  

Predict COVID onset with time-to-event regression


# predict onset from personality
cox_onset_prev <- coxph(Surv(onset_prev, event) ~ 
                          pers_o + pers_c + pers_e + pers_a + pers_n, 
                        data = df_us_onset_prev)
cox_onset_prev %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n, data = df_us_onset_prev)

  n= 2469, number of events= 2429 
   (440 observations deleted due to missingness)

           coef exp(coef) se(coef)      z Pr(>|z|)    
pers_o  0.25801   1.29435  0.01953 13.214  < 2e-16 ***
pers_c  0.01242   1.01250  0.02440  0.509   0.6107    
pers_e  0.04044   1.04127  0.01961  2.062   0.0392 *  
pers_a  0.02804   1.02844  0.02404  1.167   0.2434    
pers_n -0.13832   0.87082  0.02214 -6.248 4.17e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    1.2944     0.7726    1.2458    1.3448
pers_c    1.0125     0.9877    0.9652    1.0621
pers_e    1.0413     0.9604    1.0020    1.0821
pers_a    1.0284     0.9723    0.9811    1.0781
pers_n    0.8708     1.1483    0.8338    0.9094

Concordance= 0.658  (se = 0.006 )
Likelihood ratio test= 280.5  on 5 df,   p=<2e-16
Wald test            = 282.1  on 5 df,   p=<2e-16
Score (logrank) test = 280.1  on 5 df,   p=<2e-16
# predict onset from personality with controls
cox_onset_prev_ctrl <- coxph(Surv(onset_prev, event) ~ 
                               pers_o + pers_c + pers_e + pers_a + pers_n +
                               airport_distance + republican + medage + male + popdens +
                               manufact + tourism + academics + medinc + physician_pc,
                             data = df_us_onset_prev)
cox_onset_prev_ctrl %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n + airport_distance + republican + medage + 
    male + popdens + manufact + tourism + academics + medinc + 
    physician_pc, data = df_us_onset_prev)

  n= 2464, number of events= 2424 
   (445 observations deleted due to missingness)

                      coef exp(coef)  se(coef)       z Pr(>|z|)    
pers_o            0.219404  1.245334  0.024013   9.137  < 2e-16 ***
pers_c            0.074751  1.077615  0.026097   2.864 0.004179 ** 
pers_e            0.016376  1.016510  0.020873   0.785 0.432729    
pers_a            0.042856  1.043787  0.026698   1.605 0.108444    
pers_n            0.001372  1.001373  0.025862   0.053 0.957701    
airport_distance -0.293113  0.745938  0.029875  -9.811  < 2e-16 ***
republican       -0.181505  0.834014  0.025588  -7.093 1.31e-12 ***
medage           -0.277857  0.757405  0.022256 -12.484  < 2e-16 ***
male             -0.145115  0.864923  0.028091  -5.166 2.39e-07 ***
popdens          -0.090498  0.913477  0.024988  -3.622 0.000293 ***
manufact          0.046112  1.047192  0.024014   1.920 0.054827 .  
tourism           0.068927  1.071358  0.021260   3.242 0.001186 ** 
academics         0.052582  1.053989  0.036863   1.426 0.153748    
medinc            0.308101  1.360838  0.032191   9.571  < 2e-16 ***
physician_pc     -0.107555  0.898027  0.022305  -4.822 1.42e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                 exp(coef) exp(-coef) lower .95 upper .95
pers_o              1.2453     0.8030    1.1881    1.3053
pers_c              1.0776     0.9280    1.0239    1.1342
pers_e              1.0165     0.9838    0.9758    1.0590
pers_a              1.0438     0.9580    0.9906    1.0999
pers_n              1.0014     0.9986    0.9519    1.0534
airport_distance    0.7459     1.3406    0.7035    0.7909
republican          0.8340     1.1990    0.7932    0.8769
medage              0.7574     1.3203    0.7251    0.7912
male                0.8649     1.1562    0.8186    0.9139
popdens             0.9135     1.0947    0.8698    0.9593
manufact            1.0472     0.9549    0.9990    1.0977
tourism             1.0714     0.9334    1.0276    1.1169
academics           1.0540     0.9488    0.9805    1.1330
medinc              1.3608     0.7348    1.2776    1.4495
physician_pc        0.8980     1.1136    0.8596    0.9382

Concordance= 0.735  (se = 0.005 )
Likelihood ratio test= 998.1  on 15 df,   p=<2e-16
Wald test            = 1107  on 15 df,   p=<2e-16
Score (logrank) test = 1225  on 15 df,   p=<2e-16

Predict prevalence slopes with linear models


# predict slopes from personality
lm_slope_prev <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_us_slope_prev)
lm_slope_prev %>% summary()

Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n, data = df_us_slope_prev)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.6944 -0.2924 -0.1891 -0.0187 23.3421 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -0.0005309  0.0209836  -0.025  0.97982   
pers_o      -0.0483148  0.0239424  -2.018  0.04371 * 
pers_c      -0.0198864  0.0290107  -0.685  0.49311   
pers_e      -0.0167807  0.0240723  -0.697  0.48581   
pers_a       0.0820008  0.0295572   2.774  0.00558 **
pers_n      -0.0468186  0.0271427  -1.725  0.08468 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9959 on 2254 degrees of freedom
Multiple R-squared:  0.01033,   Adjusted R-squared:  0.008138 
F-statistic: 4.707 on 5 and 2254 DF,  p-value: 0.0002796
lm_slope_prev %>% confint(level=0.9)
                    5 %         95 %
(Intercept) -0.03506004  0.033998144
pers_o      -0.08771282 -0.008916834
pers_c      -0.06762437  0.027851544
pers_e      -0.05639238  0.022830892
pers_a       0.03336354  0.130637980
pers_n      -0.09148282 -0.002154407
# predict slopes from personality with controls
lm_slope_prev_ctrl <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n + 
                           airport_distance + republican + medage + male + popdens + 
                           manufact + tourism + academics + medinc + physician_pc,
                         data = df_us_slope_prev)
lm_slope_prev_ctrl %>% summary()

Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n + airport_distance + republican + medage + male + 
    popdens + manufact + tourism + academics + medinc + physician_pc, 
    data = df_us_slope_prev)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.7621 -0.3059 -0.1365  0.0537 22.0073 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -0.01144    0.02173  -0.526  0.59878    
pers_o           -0.01455    0.02781  -0.523  0.60097    
pers_c           -0.01846    0.02903  -0.636  0.52502    
pers_e           -0.01202    0.02408  -0.499  0.61775    
pers_a            0.08341    0.03049   2.735  0.00628 ** 
pers_n           -0.02391    0.02928  -0.817  0.41420    
airport_distance  0.04606    0.02877   1.601  0.10952    
republican       -0.10621    0.02598  -4.088 4.50e-05 ***
medage           -0.06991    0.02295  -3.047  0.00234 ** 
male              0.07055    0.02750   2.566  0.01036 *  
popdens           0.05905    0.02152   2.744  0.00611 ** 
manufact          0.08320    0.02525   3.295  0.00100 ** 
tourism           0.01052    0.02769   0.380  0.70401    
academics        -0.09219    0.03968  -2.323  0.02025 *  
medinc            0.09841    0.03352   2.936  0.00336 ** 
physician_pc      0.10935    0.02297   4.760 2.06e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9776 on 2244 degrees of freedom
Multiple R-squared:  0.05072,   Adjusted R-squared:  0.04437 
F-statistic: 7.993 on 15 and 2244 DF,  p-value: < 2.2e-16
lm_slope_prev_ctrl %>% confint(level=0.9)
                          5 %        95 %
(Intercept)      -0.047196737  0.02432453
pers_o           -0.060317938  0.03122009
pers_c           -0.066226814  0.02931540
pers_e           -0.051636468  0.02760241
pers_a            0.033234491  0.13358639
pers_n           -0.072089209  0.02426713
airport_distance -0.001281029  0.09340781
republican       -0.148955618 -0.06345988
medage           -0.107671822 -0.03215158
male              0.025301526  0.11579161
popdens           0.023640062  0.09445494
manufact          0.041644874  0.12474968
tourism          -0.035046903  0.05609068
academics        -0.157491478 -0.02689724
medinc            0.043247412  0.15356267
physician_pc      0.071549935  0.14715975

Predict prevalence slopes with censored regression


# predict slopes from personality
tobit_slope_prev <- censReg(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n, 
                            left = min(df_us_slope_prev_cens$slope_prev), right = Inf,
                         data = df_us_slope_prev_cens)
tobit_slope_prev %>% summary()

Call:
censReg(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n, left = min(df_us_slope_prev_cens$slope_prev), right = Inf, 
    data = df_us_slope_prev_cens)

Observations:
         Total  Left-censored     Uncensored Right-censored 
          2233             14           2219              0 

Coefficients:
             Estimate Std. error t value Pr(> t)   
(Intercept) -0.005082   0.021189  -0.240 0.81046   
pers_o      -0.047752   0.024299  -1.965 0.04939 * 
pers_c      -0.017213   0.029440  -0.585 0.55875   
pers_e      -0.016517   0.024479  -0.675 0.49985   
pers_a       0.081401   0.030120   2.703 0.00688 **
pers_n      -0.047847   0.027592  -1.734 0.08290 . 
logSigma    -0.001513   0.015018  -0.101 0.91975   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Newton-Raphson maximisation, 2 iterations
Return code 2: successive function values within tolerance limit
Log-likelihood: -3157.046 on 7 Df
tobit_slope_prev %>% confint(level=0.9)
                    5 %         95 %
(Intercept) -0.03993518  0.029771187
pers_o      -0.08771989 -0.007784003
pers_c      -0.06563724  0.031210354
pers_e      -0.05678204  0.023747982
pers_a       0.03185851  0.130943213
pers_n      -0.09323144 -0.002461866
logSigma    -0.02621535  0.023189436
# predict slopes from personality with controls
tobit_slope_prev_ctrl <- censReg(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n + 
                           airport_distance + republican + medage + male + popdens + 
                           manufact + tourism + academics + medinc + physician_pc,
                           left = min(df_us_slope_prev_cens$slope_prev), right = Inf,
                         data = df_us_slope_prev_cens)
tobit_slope_prev_ctrl %>% summary()

Call:
censReg(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n + airport_distance + republican + medage + male + 
    popdens + manufact + tourism + academics + medinc + physician_pc, 
    left = min(df_us_slope_prev_cens$slope_prev), right = Inf, 
    data = df_us_slope_prev_cens)

Observations:
         Total  Left-censored     Uncensored Right-censored 
          2233             14           2219              0 

Coefficients:
                 Estimate Std. error t value  Pr(> t)    
(Intercept)      -0.01735    0.02201  -0.788 0.430514    
pers_o           -0.01439    0.02824  -0.509 0.610412    
pers_c           -0.01520    0.02940  -0.517 0.605235    
pers_e           -0.01174    0.02446  -0.480 0.631236    
pers_a            0.08337    0.03098   2.691 0.007128 ** 
pers_n           -0.02222    0.02974  -0.747 0.454893    
airport_distance  0.04792    0.02913   1.645 0.099979 .  
republican       -0.10787    0.02622  -4.114 3.88e-05 ***
medage           -0.07138    0.02327  -3.068 0.002158 ** 
male              0.06885    0.02761   2.494 0.012643 *  
popdens           0.06047    0.02166   2.792 0.005243 ** 
manufact          0.08489    0.02540   3.342 0.000833 ***
tourism           0.01388    0.02807   0.494 0.620985    
academics        -0.09198    0.03987  -2.307 0.021045 *  
medinc            0.09873    0.03369   2.931 0.003380 ** 
physician_pc      0.11114    0.02330   4.769 1.85e-06 ***
logSigma         -0.02252    0.01502  -1.499 0.133768    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Newton-Raphson maximisation, 3 iterations
Return code 1: gradient close to zero
Log-likelihood: -3110.339 on 17 Df
tobit_slope_prev_ctrl %>% confint(level=0.9)
                           5 %         95 %
(Intercept)      -5.354314e-02  0.018848670
pers_o           -6.084617e-02  0.032066833
pers_c           -6.355657e-02  0.033162950
pers_e           -5.196628e-02  0.028488571
pers_a            3.240711e-02  0.134335675
pers_n           -7.113228e-02  0.026690043
airport_distance  2.991424e-06  0.095841919
republican       -1.509982e-01 -0.064747430
medage           -1.096460e-01 -0.033104079
male              2.343624e-02  0.114267420
popdens           2.484103e-02  0.096096473
manufact          4.310256e-02  0.126669193
tourism          -3.228815e-02  0.060043758
academics        -1.575597e-01 -0.026405710
medinc            4.331968e-02  0.154134078
physician_pc      7.280430e-02  0.149466568
logSigma         -4.721970e-02  0.002184288

CRF predicting slopes


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_slope_prev <- cforest(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n + 
                           airport_distance + republican + medage + male + popdens + 
                           manufact + tourism + academics + medinc + physician_pc,
                           data = df_us_slope_prev, 
                         controls = ctrls)

crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)

crf_slope_prev_varimp
          pers_o           pers_c           pers_e           pers_a 
    0.0069588100     0.0053233415     0.0009241402     0.0336522004 
          pers_n airport_distance       republican           medage 
    0.0101345184     0.0088034043     0.0113297404     0.0409948903 
            male          popdens         manufact          tourism 
    0.0159517791     0.0237333099     0.0559568844     0.0099654006 
       academics           medinc     physician_pc 
    0.0160422150     0.0067803089    -0.0006294380 
crf_slope_prev_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_slope_prev_varimp_cond
          pers_o           pers_c           pers_e           pers_a 
    0.0030020160     0.0186830072     0.0003241834     0.0312488347 
          pers_n airport_distance       republican           medage 
    0.0131618928     0.0212862058     0.0088770492     0.0536994750 
            male          popdens         manufact          tourism 
    0.0148531988     0.0239457182     0.0609858257     0.0094635969 
       academics           medinc     physician_pc 
    0.0219869043     0.0204296385     0.0013880483 
crf_slope_prev_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

Predict Social Distancing

Change point analysis


# keep only counties with full data
fips_complete <- df_us_socdist_scaled %>% 
  group_by(county_fips) %>% 
  summarize(n = n()) %>% 
  filter(n==max(.$n)) %>% 
  .$county_fips

# run changepoint analysis
df_us_socdist_cpt_results <- df_us_socdist_scaled %>% 
  select(county_fips, socdist_single_tile) %>%
  filter(county_fips %in% fips_complete) %>% 
  split(.$county_fips) %>%
  map(~ cpt.meanvar(as.vector(.$socdist_single_tile),
                    #penalty = 'Asymptotic',
                    class=TRUE,
                    param.estimates=TRUE,
                    Q=1,
                    test.stat = 'Normal'))

df_us_socdist_cpt_results_2 <- df_us_socdist_scaled %>% 
  select(county_fips, socdist_tiles) %>%
  filter(county_fips %in% fips_complete) %>% 
  split(.$county_fips) %>%
  map(~ cpt.meanvar(as.vector(.$socdist_tiles),
                    #penalty = 'Asymptotic',
                    class=TRUE,
                    param.estimates=TRUE,
                    Q=1,
                    test.stat = 'Normal'))

# calculate change point
df_us_socdist_cpt_day <- df_us_socdist_cpt_results %>% 
  map(cpts) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(cpt_day_socdist = '.') %>%
  rownames_to_column('county_fips')

df_us_socdist_cpt_day_2 <- df_us_socdist_cpt_results_2 %>% 
  map(cpts) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(cpt_day_socdist_2 = '.') %>%
  rownames_to_column('county_fips')

# calculate mean differences
df_us_socdist_cpt_mean_diff <- df_us_socdist_cpt_results %>% 
  map(param.est) %>% 
  map(~ .$mean) %>% 
  map(~ .[2]-.[1]) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(mean_diff_socdist = '.') %>%
  rownames_to_column('county_fips')

df_us_socdist_cpt_mean_diff_2 <- df_us_socdist_cpt_results_2 %>% 
  map(param.est) %>% 
  map(~ .$mean) %>% 
  map(~ .[1]-.[2]) %>% 
  unlist() %>% 
  as.data.frame() %>% 
  rename(mean_diff_socdist_2 = '.') %>%
  rownames_to_column('county_fips')

# merge with county data
df_us_cpt_socdist <- df_us_socdist_scaled %>% 
  select(-time, -socdist_single_tile, -socdist_tiles) %>%
  distinct() %>% 
  left_join(df_us_socdist_cpt_day, by='county_fips') %>%
  left_join(df_us_socdist_cpt_day_2, by='county_fips') %>%
  left_join(df_us_socdist_cpt_mean_diff, by='county_fips') %>%
  left_join(df_us_socdist_cpt_mean_diff_2, by='county_fips') %>%
  left_join(select(df_us_onset_prev, county_fips, onset_prev), by='county_fips') %>%
  left_join(select(df_us_slope_prev, county_fips, slope_prev), by='county_fips') 

# standardize mean/var differences
df_us_cpt_socdist <- df_us_cpt_socdist %>% 
  mutate(mean_diff_socdist = scale(mean_diff_socdist),
         mean_diff_socdist_2 = scale(mean_diff_socdist_2))

# handle censored data
df_us_cpt_socdist <- df_us_cpt_socdist %>% 
  mutate(cpt_day_socdist = ifelse(is.na(cpt_day_socdist), as.numeric(diff(range(df_us_socdist$date))), cpt_day_socdist)) %>% 
  mutate(event = ifelse(cpt_day_socdist >= as.numeric(diff(range(df_us_socdist$date))), 0, 1))
df_us_cpt_socdist$cpt_day_socdist %>% hist()

df_us_cpt_socdist$mean_diff_socdist %>% hist()


df_us_cpt_socdist$cpt_day_socdist_2 %>% hist()

df_us_cpt_socdist$mean_diff_socdist_2 %>% hist()


for(i in head(df_us_socdist_cpt_results, 5)){
  plot(i)
}

NA


for(i in head(df_us_socdist_cpt_results_2, 5)){
  plot(i)
}

NA

Predicting change points with time-to-event regression


# predict hazard from personality
cox_cpt_socdist <- coxph(Surv(cpt_day_socdist, event) ~ 
                           pers_o + pers_c + pers_e + pers_a + pers_n, 
                  data = df_us_cpt_socdist)
cox_cpt_socdist %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n, data = df_us_cpt_socdist)

  n= 2380, number of events= 2379 

            coef exp(coef)  se(coef)      z Pr(>|z|)    
pers_o -0.189086  0.827715  0.023503 -8.045 8.61e-16 ***
pers_c -0.033629  0.966931  0.027365 -1.229  0.21912    
pers_e  0.004178  1.004187  0.023905  0.175  0.86126    
pers_a -0.084190  0.919256  0.028674 -2.936  0.00332 ** 
pers_n  0.060781  1.062667  0.027280  2.228  0.02588 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    0.8277     1.2081    0.7905    0.8667
pers_c    0.9669     1.0342    0.9164    1.0202
pers_e    1.0042     0.9958    0.9582    1.0524
pers_a    0.9193     1.0878    0.8690    0.9724
pers_n    1.0627     0.9410    1.0073    1.1210

Concordance= 0.593  (se = 0.007 )
Likelihood ratio test= 121.9  on 5 df,   p=<2e-16
Wald test            = 124.3  on 5 df,   p=<2e-16
Score (logrank) test = 123.9  on 5 df,   p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl <- coxph(Surv(cpt_day_socdist, event) ~ 
                                 pers_o + pers_c + pers_e + pers_a + pers_n + 
                           airport_distance + republican + medage + male + popdens + 
                           manufact + tourism + academics + medinc + physician_pc +
                           onset_prev + slope_prev ,
                  data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n + airport_distance + republican + 
    medage + male + popdens + manufact + tourism + academics + 
    medinc + physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)

  n= 2196, number of events= 2195 
   (184 observations deleted due to missingness)

                       coef  exp(coef)   se(coef)      z Pr(>|z|)    
pers_o           -0.0923731  0.9117649  0.0296366 -3.117 0.001828 ** 
pers_c           -0.0557289  0.9457955  0.0290405 -1.919 0.054983 .  
pers_e            0.0024032  1.0024061  0.0260018  0.092 0.926360    
pers_a           -0.0834917  0.9198987  0.0321849 -2.594 0.009483 ** 
pers_n            0.0218463  1.0220867  0.0318519  0.686 0.492794    
airport_distance  0.0323170  1.0328449  0.0270192  1.196 0.231668    
republican        0.0274670  1.0278477  0.0270193  1.017 0.309358    
medage            0.0168080  1.0169500  0.0221423  0.759 0.447799    
male              0.0123963  1.0124734  0.0233575  0.531 0.595614    
popdens          -0.2671107  0.7655883  0.0721589 -3.702 0.000214 ***
manufact          0.0983611  1.1033612  0.0242468  4.057 4.98e-05 ***
tourism          -0.0858071  0.9177712  0.0265987 -3.226 0.001255 ** 
academics         0.1451860  1.1562546  0.0431797  3.362 0.000773 ***
medinc           -0.0752502  0.9275114  0.0360780 -2.086 0.037000 *  
physician_pc      0.0001824  1.0001824  0.0253754  0.007 0.994264    
onset_prev        0.0077552  1.0077853  0.0032047  2.420 0.015522 *  
slope_prev       -0.1210372  0.8860010  0.0317937 -3.807 0.000141 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                 exp(coef) exp(-coef) lower .95 upper .95
pers_o              0.9118     1.0968    0.8603    0.9663
pers_c              0.9458     1.0573    0.8935    1.0012
pers_e              1.0024     0.9976    0.9526    1.0548
pers_a              0.9199     1.0871    0.8637    0.9798
pers_n              1.0221     0.9784    0.9602    1.0879
airport_distance    1.0328     0.9682    0.9796    1.0890
republican          1.0278     0.9729    0.9748    1.0837
medage              1.0170     0.9833    0.9738    1.0621
male                1.0125     0.9877    0.9672    1.0599
popdens             0.7656     1.3062    0.6646    0.8819
manufact            1.1034     0.9063    1.0522    1.1571
tourism             0.9178     1.0896    0.8712    0.9669
academics           1.1563     0.8649    1.0624    1.2584
medinc              0.9275     1.0782    0.8642    0.9955
physician_pc        1.0002     0.9998    0.9517    1.0512
onset_prev          1.0078     0.9923    1.0015    1.0141
slope_prev          0.8860     1.1287    0.8325    0.9430

Concordance= 0.615  (se = 0.008 )
Likelihood ratio test= 203.7  on 17 df,   p=<2e-16
Wald test            = 184.4  on 17 df,   p=<2e-16
Score (logrank) test = 188.3  on 17 df,   p=<2e-16

Linear models predicting mean differences


lm_meandiff_socdist <- lm(mean_diff_socdist ~ 
                            pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_us_cpt_socdist)
lm_meandiff_socdist %>% summary()

Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n, data = df_us_cpt_socdist)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.7658 -0.5742 -0.0819  0.4870  6.0744 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -5.168e-16  1.808e-02   0.000        1    
pers_o       3.448e-01  1.961e-02  17.583  < 2e-16 ***
pers_c      -1.622e-01  2.453e-02  -6.610 4.72e-11 ***
pers_e       1.321e-01  2.017e-02   6.549 7.08e-11 ***
pers_a      -1.376e-01  2.505e-02  -5.492 4.39e-08 ***
pers_n      -1.104e-01  2.288e-02  -4.825 1.49e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8822 on 2374 degrees of freedom
Multiple R-squared:  0.2233,    Adjusted R-squared:  0.2217 
F-statistic: 136.5 on 5 and 2374 DF,  p-value: < 2.2e-16
lm_meandiff_socdist %>% confint(level=0.9)
                    5 %        95 %
(Intercept) -0.02975669  0.02975669
pers_o       0.31251542  0.37704681
pers_c      -0.20255000 -0.12180865
pers_e       0.09890660  0.16529010
pers_a      -0.17877385 -0.09634921
pers_n      -0.14807707 -0.07276741
lm_meandiff_socdist_ctrl <- lm(mean_diff_socdist ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n + 
                              airport_distance + republican + medage + male + popdens + 
                              manufact + tourism + academics + medinc + physician_pc +
                              onset_prev + slope_prev ,
                            data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl %>% summary()

Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a + 
    pers_n + airport_distance + republican + medage + male + 
    popdens + manufact + tourism + academics + medinc + physician_pc + 
    onset_prev + slope_prev, data = df_us_cpt_socdist)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.18454 -0.37354 -0.04018  0.32901  2.71979 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)       0.933063   0.119257   7.824 7.92e-15 ***
pers_o            0.050890   0.016370   3.109 0.001903 ** 
pers_c           -0.055675   0.017167  -3.243 0.001200 ** 
pers_e            0.059599   0.014328   4.160 3.31e-05 ***
pers_a           -0.042432   0.018380  -2.309 0.021061 *  
pers_n            0.131964   0.017479   7.550 6.36e-14 ***
airport_distance -0.039999   0.013904  -2.877 0.004057 ** 
republican       -0.260446   0.015120 -17.225  < 2e-16 ***
medage            0.099828   0.013375   7.464 1.21e-13 ***
male              0.043997   0.013892   3.167 0.001561 ** 
popdens           0.234350   0.031231   7.504 8.99e-14 ***
manufact          0.009840   0.014850   0.663 0.507633    
tourism           0.090837   0.014939   6.081 1.41e-09 ***
academics         0.161546   0.024473   6.601 5.12e-11 ***
medinc            0.378549   0.020675  18.309  < 2e-16 ***
physician_pc     -0.004576   0.013600  -0.336 0.736576    
onset_prev       -0.013586   0.001764  -7.703 2.00e-14 ***
slope_prev        0.042580   0.012512   3.403 0.000678 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5709 on 2178 degrees of freedom
  (184 observations deleted due to missingness)
Multiple R-squared:  0.6642,    Adjusted R-squared:  0.6616 
F-statistic: 253.5 on 17 and 2178 DF,  p-value: < 2.2e-16
lm_meandiff_socdist_ctrl %>% confint(level=0.9)
                         5 %        95 %
(Intercept)       0.73681930  1.12930762
pers_o            0.02395230  0.07782772
pers_c           -0.08392327 -0.02742598
pers_e            0.03602151  0.08317608
pers_a           -0.07267787 -0.01218633
pers_n            0.10320155  0.16072607
airport_distance -0.06287822 -0.01711884
republican       -0.28532668 -0.23556552
medage            0.07781790  0.12183798
male              0.02113686  0.06685733
popdens           0.18295701  0.28574228
manufact         -0.01459616  0.03427626
tourism           0.06625519  0.11541954
academics         0.12127362  0.20181810
medinc            0.34452716  0.41257115
physician_pc     -0.02695577  0.01780451
onset_prev       -0.01648877 -0.01068414
slope_prev        0.02199129  0.06316910

CRF predicting mean difference


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_meandiff_socdist <- cforest(mean_diff_socdist ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                                  airport_distance + republican + medage + male + popdens + 
                                  manufact + tourism + academics + medinc + physician_pc,
                           data = df_us_cpt_socdist,
                         controls = ctrls)

crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist, conditional = T, nperm = 1)

crf_meandiff_socdist_varimp
          pers_o           pers_c           pers_e           pers_a 
    1.614037e-02     2.423785e-02     2.732908e-05     3.101524e-02 
          pers_n airport_distance       republican           medage 
    9.194875e-03     6.062698e-03     1.533444e-01     1.409992e-02 
            male          popdens         manufact          tourism 
    6.976691e-03     1.440436e-01     7.407710e-03     1.852098e-02 
       academics           medinc     physician_pc 
    1.529007e-01     2.018907e-01     2.242878e-03 
crf_meandiff_socdist_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))


crf_meandiff_socdist_varimp_cond
          pers_o           pers_c           pers_e           pers_a 
    0.0173120419     0.0268238558     0.0007997082     0.0325974638 
          pers_n airport_distance       republican           medage 
    0.0127582857     0.0065079941     0.1673575442     0.0147002262 
            male          popdens         manufact          tourism 
    0.0066593632     0.1439615291     0.0075370064     0.0190248211 
       academics           medinc     physician_pc 
    0.1686254063     0.2106451498     0.0026035500 
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

Predicting change points with time-to-event regression


# predict hazard from personality
cox_cpt_socdist_2 <- coxph(Surv(cpt_day_socdist_2, event) ~ 
                           pers_o + pers_c + pers_e + pers_a + pers_n, 
                  data = df_us_cpt_socdist)
cox_cpt_socdist_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n, data = df_us_cpt_socdist)

  n= 2380, number of events= 2379 

           coef exp(coef) se(coef)      z Pr(>|z|)    
pers_o -0.14730   0.86303  0.02283 -6.453 1.10e-10 ***
pers_c -0.11744   0.88919  0.02688 -4.369 1.25e-05 ***
pers_e  0.03018   1.03064  0.02355  1.282  0.19998    
pers_a  0.03223   1.03276  0.02720  1.185  0.23607    
pers_n  0.07865   1.08183  0.02638  2.982  0.00287 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

       exp(coef) exp(-coef) lower .95 upper .95
pers_o    0.8630     1.1587    0.8253    0.9025
pers_c    0.8892     1.1246    0.8436    0.9373
pers_e    1.0306     0.9703    0.9841    1.0793
pers_a    1.0328     0.9683    0.9791    1.0893
pers_n    1.0818     0.9244    1.0273    1.1392

Concordance= 0.598  (se = 0.008 )
Likelihood ratio test= 109.1  on 5 df,   p=<2e-16
Wald test            = 112.2  on 5 df,   p=<2e-16
Score (logrank) test = 111.5  on 5 df,   p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl_2 <- coxph(Surv(cpt_day_socdist_2, event) ~ 
                                 pers_o + pers_c + pers_e + pers_a + pers_n + 
                           airport_distance + republican + medage + male + popdens + 
                           manufact + tourism + academics + medinc + physician_pc +
                           onset_prev + slope_prev ,
                  data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c + 
    pers_e + pers_a + pers_n + airport_distance + republican + 
    medage + male + popdens + manufact + tourism + academics + 
    medinc + physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)

  n= 2196, number of events= 2195 
   (184 observations deleted due to missingness)

                      coef exp(coef)  se(coef)      z Pr(>|z|)    
pers_o           -0.103657  0.901534  0.029764 -3.483 0.000497 ***
pers_c           -0.120681  0.886317  0.029377 -4.108 3.99e-05 ***
pers_e            0.035021  1.035642  0.026256  1.334 0.182259    
pers_a            0.014626  1.014733  0.031050  0.471 0.637614    
pers_n            0.046338  1.047428  0.031442  1.474 0.140544    
airport_distance  0.005353  1.005367  0.025734  0.208 0.835217    
republican       -0.006681  0.993342  0.026860 -0.249 0.803578    
medage            0.010936  1.010996  0.022736  0.481 0.630517    
male             -0.010455  0.989599  0.023257 -0.450 0.653034    
popdens          -0.233974  0.791383  0.066998 -3.492 0.000479 ***
manufact          0.154049  1.166548  0.025299  6.089 1.14e-09 ***
tourism          -0.068794  0.933519  0.026663 -2.580 0.009876 ** 
academics         0.128110  1.136678  0.041308  3.101 0.001926 ** 
medinc           -0.011745  0.988323  0.034107 -0.344 0.730568    
physician_pc     -0.030768  0.969701  0.024904 -1.235 0.216659    
onset_prev        0.004743  1.004754  0.003206  1.479 0.139121    
slope_prev       -0.102630  0.902461  0.030615 -3.352 0.000801 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                 exp(coef) exp(-coef) lower .95 upper .95
pers_o              0.9015     1.1092    0.8504    0.9557
pers_c              0.8863     1.1283    0.8367    0.9388
pers_e              1.0356     0.9656    0.9837    1.0903
pers_a              1.0147     0.9855    0.9548    1.0784
pers_n              1.0474     0.9547    0.9848    1.1140
airport_distance    1.0054     0.9947    0.9559    1.0574
republican          0.9933     1.0067    0.9424    1.0470
medage              1.0110     0.9891    0.9669    1.0571
male                0.9896     1.0105    0.9455    1.0358
popdens             0.7914     1.2636    0.6940    0.9024
manufact            1.1665     0.8572    1.1101    1.2259
tourism             0.9335     1.0712    0.8860    0.9836
academics           1.1367     0.8798    1.0483    1.2325
medinc              0.9883     1.0118    0.9244    1.0566
physician_pc        0.9697     1.0312    0.9235    1.0182
onset_prev          1.0048     0.9953    0.9985    1.0111
slope_prev          0.9025     1.1081    0.8499    0.9583

Concordance= 0.63  (se = 0.008 )
Likelihood ratio test= 197.1  on 17 df,   p=<2e-16
Wald test            = 188.2  on 17 df,   p=<2e-16
Score (logrank) test = 190.4  on 17 df,   p=<2e-16

Linear models predicting mean differences


lm_meandiff_socdist_2 <- lm(mean_diff_socdist_2 ~ 
                            pers_o + pers_c + pers_e + pers_a + pers_n, 
                         data = df_us_cpt_socdist)
lm_meandiff_socdist_2 %>% summary()

Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n, data = df_us_cpt_socdist)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.9433  -0.3894   0.0131   0.4666   3.5265 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -4.037e-16  1.935e-02   0.000 1.000000    
pers_o       3.012e-01  2.098e-02  14.355  < 2e-16 ***
pers_c      -9.312e-02  2.625e-02  -3.547 0.000397 ***
pers_e       6.867e-02  2.158e-02   3.181 0.001484 ** 
pers_a      -2.872e-02  2.680e-02  -1.072 0.284018    
pers_n      -2.435e-02  2.449e-02  -0.994 0.320129    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.944 on 2374 degrees of freedom
Multiple R-squared:  0.1107,    Adjusted R-squared:  0.1089 
F-statistic: 59.13 on 5 and 2374 DF,  p-value: < 2.2e-16
lm_meandiff_socdist_2 %>% confint(level=0.9)
                    5 %        95 %
(Intercept) -0.03184033  0.03184033
pers_o       0.26667433  0.33572435
pers_c      -0.13632049 -0.04992544
pers_e       0.03315103  0.10418286
pers_a      -0.07281565  0.01538056
pers_n      -0.06464033  0.01594268
lm_meandiff_socdist_ctrl_2 <- lm(mean_diff_socdist_2 ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n + 
                              airport_distance + republican + medage + male + popdens + 
                              manufact + tourism + academics + medinc + physician_pc +
                              onset_prev + slope_prev ,
                            data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl_2 %>% summary()

Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e + 
    pers_a + pers_n + airport_distance + republican + medage + 
    male + popdens + manufact + tourism + academics + medinc + 
    physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.7181  -0.2980   0.0295   0.3613   3.5496 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)       0.69264    0.17509   3.956 7.87e-05 ***
pers_o            0.10029    0.02403   4.173 3.13e-05 ***
pers_c           -0.03809    0.02520  -1.511  0.13090    
pers_e            0.02990    0.02104   1.421  0.15543    
pers_a            0.03920    0.02699   1.453  0.14647    
pers_n            0.13351    0.02566   5.203 2.15e-07 ***
airport_distance -0.11922    0.02041  -5.840 6.00e-09 ***
republican       -0.16546    0.02220  -7.453 1.31e-13 ***
medage            0.05129    0.01964   2.612  0.00906 ** 
male              0.01352    0.02040   0.663  0.50753    
popdens           0.05980    0.04585   1.304  0.19229    
manufact         -0.10282    0.02180  -4.716 2.56e-06 ***
tourism           0.09773    0.02193   4.456 8.77e-06 ***
academics        -0.03454    0.03593  -0.961  0.33649    
medinc            0.30234    0.03036   9.960  < 2e-16 ***
physician_pc     -0.03573    0.01997  -1.789  0.07371 .  
onset_prev       -0.01011    0.00259  -3.905 9.70e-05 ***
slope_prev        0.03842    0.01837   2.091  0.03662 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8382 on 2178 degrees of freedom
  (184 observations deleted due to missingness)
Multiple R-squared:  0.2922,    Adjusted R-squared:  0.2867 
F-statistic:  52.9 on 17 and 2178 DF,  p-value: < 2.2e-16
lm_meandiff_socdist_ctrl_2 %>% confint(level=0.9)
                          5 %         95 %
(Intercept)       0.404509277  0.980759910
pers_o            0.060739497  0.139839292
pers_c           -0.079561227  0.003387984
pers_e           -0.004721244  0.064511015
pers_a           -0.005205988  0.083607586
pers_n            0.091283064  0.175740460
airport_distance -0.152808310 -0.085624474
republican       -0.201985450 -0.128926199
medage            0.018978426  0.083608629
male             -0.020044734  0.047081972
popdens          -0.015651171  0.135257974
manufact         -0.138694111 -0.066939714
tourism           0.061641628  0.133824640
academics        -0.093670255  0.024584991
medinc            0.252393233  0.352295292
physician_pc     -0.068586967 -0.002870009
onset_prev       -0.014374120 -0.005851771
slope_prev        0.008188419  0.068645614

CRF predicting mean difference


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_meandiff_socdist_2 <- cforest(mean_diff_socdist_2 ~ 
                                  pers_o + pers_c + pers_e + pers_a + pers_n +
                                  airport_distance + republican + medage + male + popdens + 
                                  manufact + tourism + academics + medinc + physician_pc,
                           data = df_us_cpt_socdist,
                         controls = ctrls)

crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist_2, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist_2, conditional = T, nperm = 1)

crf_meandiff_socdist_varimp
          pers_o           pers_c           pers_e           pers_a 
     0.039260552      0.012302722      0.002330488      0.011952030 
          pers_n airport_distance       republican           medage 
     0.006029187      0.020302199      0.080534580      0.009563549 
            male          popdens         manufact          tourism 
     0.005388067      0.108579172      0.036924193      0.016906413 
       academics           medinc     physician_pc 
     0.055033273      0.090556592      0.002284354 
crf_meandiff_socdist_varimp %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))


crf_meandiff_socdist_varimp_cond
          pers_o           pers_c           pers_e           pers_a 
     0.043664416      0.011665283      0.001743354      0.014833439 
          pers_n airport_distance       republican           medage 
     0.008701287      0.020987417      0.081218508      0.012618969 
            male          popdens         manufact          tourism 
     0.006820099      0.110563441      0.036236182      0.016517248 
       academics           medinc     physician_pc 
     0.072596700      0.095937274      0.005176225 
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>% 
  rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

Export data

us_list_results <- list(cox_onset_prev, cox_onset_prev_ctrl, 
     lm_slope_prev, lm_slope_prev_ctrl, 
     cox_cpt_socdist, cox_cpt_socdist_ctrl,
     lm_meandiff_socdist, lm_meandiff_socdist_ctrl,
     cox_cpt_socdist_2, cox_cpt_socdist_ctrl_2,
     lm_meandiff_socdist_2, lm_meandiff_socdist_ctrl_2)

results_names <- list('cox_onset_prev', 'cox_onset_prev_ctrl', 
     'lm_slope_prev', 'lm_slope_prev_ctrl', 
     'cox_cpt_socdist', 'cox_cpt_socdist_ctrl', 
     'lm_meandiff_socdist', 'lm_meandiff_socdist_ctrl',
     'cox_cpt_socdist_2', 'cox_cpt_socdist_ctrl_2',
     'lm_meandiff_socdist_2', 'lm_meandiff_socdist_ctrl_2')

names(us_list_results) <- results_names

save(us_list_results, file="us_list_results.RData")
write_csv(df_us_slope_prev, 'df_us_slope_prev.csv')
write_csv(df_us_cpt_socdist, 'df_us_cpt_socdist.csv')
LS0tCnRpdGxlOiAiQ09WSUQtMTkgVVMiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMTUvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VUycpCgpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCmxpYnJhcnkoZG9QYXJhbGxlbCkKbGlicmFyeShjaGFuZ2Vwb2ludCkKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShzdXJ2bWluZXIpCmxpYnJhcnkoY2Vuc1JlZykKCmBgYAoKCiMgUHJlcGFyZSBjb3VudHkgbGV2ZWwgZGF0YSAKCiMjIyBSZWFkIGFuZCBmb3JtYXQgcGVyc29uYWxpdHkgZGF0YSAKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpkZl91c19wZXJzIDwtIHJlYWRfY3N2KCd0aW1lc2VyaWVzX3VzYV9jb3VudHlfbWFyY2gxX2FwcmlsXzA5LmNzdicpCgpkZl91c19wZXJzIDwtIGRmX3VzX3BlcnMgJT4lIHNlbGVjdChjb3VudHlmaXBzLCBvcGVuLCBzY2ksIGV4dHJhLCBhZ3JlZSwgc3RhYmlsKSAlPiUgCiAgbXV0YXRlKHN0YWJpbCA9IDYtc3RhYmlsKSAlPiUKICBkcGx5cjo6cmVuYW1lKGNvdW50eV9maXBzID0gY291bnR5ZmlwcywKICAgICAgICAgcGVyc19vID0gb3BlbiwgCiAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgcGVyc19lID0gZXh0cmEsCiAgICAgICAgIHBlcnNfYSA9IGFncmVlLAogICAgICAgICBwZXJzX24gPSBzdGFiaWwpICU+JSAKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCgpkZl91c19wZXJzCmBgYAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBwcmV2YWxlbmNlIGRhdGEgCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZGZfdXNfcHJldiA8LSByZWFkX2NzdignVVNBX3RpbWVzZXJpZXNfcHJlcF8yMDA1LmNzdicpCgpkZl91c19wcmV2IDwtIGRmX3VzX3ByZXYgJT4lIAogIHNlbGVjdChmaXBzLCBkYXRlLCByYXRlKSAlPiUgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlZCViJVkiKSkgJT4lIAogIHJlbmFtZShjb3VudHlfZmlwcyA9IGZpcHMsIAogICAgICAgICByYXRlX2RheSA9IHJhdGUpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCgpkZl91c19wcmV2CmBgYAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBjb3VudHkgbGV2ZWwgY29udHJvbHMgCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpkZl91c19jdHJsIDwtIHJlYWQuY3N2KCdjb250cm9sc19VUy5jc3YnKQoKZGZfdXNfY3RybCA8LSBkZl91c19jdHJsICU+JSBzZWxlY3QoLWNvdW50eV9uYW1lKSAlPiUgCiAgcmVuYW1lKGNvdW50eV9maXBzID0gY291bnR5KSAlPiUKICBtdXRhdGUoY291bnR5X2ZpcHMgPSBhcy5jaGFyYWN0ZXIoY291bnR5X2ZpcHMpKQoKZGZfdXNfY3RybApgYGAKCiMjIyBSZWFkIGFuZCBmb3JtYXQgc29jaWFsIGRpc3RhbmNpbmcgZGF0YSBGQgpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmZiX2ZpbGVzIDwtIGxpc3QuZmlsZXMoJy4uL0ZCIERhdGEvVVMgaW5kaXZpZHVhbCBmaWxlcy9Nb2JpbGl0eS8nLAogICAgICAgICAgICAgICAgICAgICAgICcqLmNzdicsIGZ1bGwubmFtZXMgPSBUKQoKZGZfdXNfc29jZGlzdCA8LSBmYl9maWxlcyAlPiUgCiAgbWFwKHJlYWRfY3N2KSAlPiUgYmluZF9yb3dzKCkKCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUKICBzZWxlY3QoLWFnZV9icmFja2V0LCAtZ2VuZGVyLCAtYmFzZWxpbmVfbmFtZSwgLWJhc2VsaW5lX3R5cGUsIC1wb2x5Z29uX25hbWUpICU+JQogIHJlbmFtZShkYXRlID0gZHMsCiAgICAgICAgIGNvdW50eV9maXBzID0gcG9seWdvbl9pZCwKICAgICAgICAgc29jZGlzdF90aWxlcyA9IGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0aXZlX2NoYW5nZSwKICAgICAgICAgc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCgpkZl91c19zb2NkaXN0CmBgYAoKCiMjIyBNZXJnZSBkYXRhCmBgYHtyfQoKIyBjcmVhdGUgc2VxdWVuY2Ugb2YgZGF0ZXMKZGF0ZV9zZXF1ZW5jZSA8LSBzZXEuRGF0ZShtaW4oZGZfdXNfcHJldiRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZfdXNfcHJldiRkYXRlKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gZGF0YS5mcmFtZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKIyBqb2luIGRhdGEgZnJhbWVzIApkZl91c19wcmV2IDwtIGRmX3VzX3ByZXYgJT4lCiAgcGx5cjo6am9pbihkZl91c19jdHJsLCBieT0nY291bnR5X2ZpcHMnKSAlPiUgCiAgcGx5cjo6am9pbihkZl91c19wZXJzLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBtZXJnZShkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcywgZGF0ZSkKCmRmX3VzX3ByZXYKYGBgCgoKYGBge3J9CgojIGNyZWF0ZSBzZXF1ZW5jZSBvZiBkYXRlcwpkYXRlX3NlcXVlbmNlIDwtIHNlcS5EYXRlKG1pbihkZl91c19zb2NkaXN0JGRhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFzLkRhdGUoJzIwMjAtMDQtMjgnKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gZGF0YS5mcmFtZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKIyBqb2luIGRhdGEgZnJhbWVzIApkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lCiAgcGx5cjo6am9pbihkZl91c19jdHJsLCBieT0nY291bnR5X2ZpcHMnKSAlPiUgCiAgcGx5cjo6am9pbihkZl91c19wZXJzLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBpbm5lcl9qb2luKGRmX2RhdGVzLCBieT0nZGF0ZScpICU+JSAKICBhcnJhbmdlKGNvdW50eV9maXBzLCBkYXRlKQoKZmlwc19jb21wbGV0ZSA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIHN1bW1hcml6ZShuID0gbigpKSAlPiUgCiAgZmlsdGVyKCEgbjxtYXgobikpICU+JSAuJGNvdW50eV9maXBzCgpkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lCiAgZmlsdGVyKGNvdW50eV9maXBzICVpbiUgZmlwc19jb21wbGV0ZSkKCmRmX3VzX3NvY2Rpc3QKYGBgCgoKCiMjIyBDb250cm9sIGZvciB3ZWVrZW5kIGVmZmVjdCAKYGBge3J9CgplYXN0ZXIgPC0gc2VxLkRhdGUoYXMuRGF0ZSgnMjAyMC0wNC0xMCcpLCBhcy5EYXRlKCcyMDIwLTA0LTEzJyksIDEpCgpkZl91c19sb2VzcyA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIGZpbHRlcighd2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyKSAlPiUgCiAgc3BsaXQoLiRjb3VudHlfZmlwcykgJT4lCiAgbWFwKH4gbG9lc3Moc29jZGlzdF9zaW5nbGVfdGlsZSB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKHByZWRpY3QsIDE6bWF4KGRmX3VzX3NvY2Rpc3QkdGltZSkpICU+JSAKICBiaW5kX3Jvd3MoKSAlPiUgCiAgZ2F0aGVyKGtleSA9ICdjb3VudHlfZmlwcycsIHZhbHVlID0gJ2xvZXNzJykgJT4lIAogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpCgpkZl91c19sb2Vzc18yIDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIG11dGF0ZSh3ZWVrZGF5ID0gZm9ybWF0KGRhdGUsICcldScpKSAlPiUgCiAgZmlsdGVyKCF3ZWVrZGF5ICVpbiUgYygnNicsJzcnKSB8IGRhdGUgJWluJSBlYXN0ZXIpICU+JSAKICBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUKICBtYXAofiBsb2Vzcyhzb2NkaXN0X3RpbGVzIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAocHJlZGljdCwgMTptYXgoZGZfdXNfc29jZGlzdCR0aW1lKSkgJT4lIAogIGJpbmRfcm93cygpICU+JSAKICBnYXRoZXIoa2V5ID0gJ2NvdW50eV9maXBzJywgdmFsdWUgPSAnbG9lc3MnKSAlPiUgCiAgcmVuYW1lKGxvZXNzXzIgPSBsb2VzcykgJT4lCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUodGltZSA9IHJvd19udW1iZXIoKSkKCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgbWVyZ2UoZGZfdXNfbG9lc3MsIGJ5PWMoJ2NvdW50eV9maXBzJywgJ3RpbWUnKSkgJT4lIAogIG1lcmdlKGRmX3VzX2xvZXNzXzIsIGJ5PWMoJ2NvdW50eV9maXBzJywgJ3RpbWUnKSkgJT4lIAogIG11dGF0ZSh3ZWVrZGF5ID0gZm9ybWF0KGRhdGUsICcldScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2Uod2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2Vzcywgc29jZGlzdF9zaW5nbGVfdGlsZSksCiAgICAgICAgIHNvY2Rpc3RfdGlsZXNfY2xlYW4gPSBpZmVsc2Uod2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2Vzc18yLCBzb2NkaXN0X3RpbGVzKSkgJT4lCiAgYXJyYW5nZShjb3VudHlfZmlwcywgdGltZSkgJT4lIAogIHNlbGVjdCgtd2Vla2RheSkKCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUgZHJvcF9uYSgpICU+JSBtdXRhdGUodGltZSA9IHRpbWUtMSkKYGBgCgoKIyMjIFBsb3QgcHJldmFsZW5jZSBvdmVyIHRpbWUKYGBge3J9CgpkZl91c19wcmV2ICU+JSBzYW1wbGVfbigyMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBwcmV2YWxlbmNlIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfdXNfcHJldiAlPiUgCiAgbXV0YXRlKHByZXZfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMDUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGUoLltbaV1dLCAwLjk1LCBuYS5ybT1UKSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIAogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CmBgYAoKIyMjIFBsb3Qgc29jaWFsIGRpc3RhbmNpbmcgc2luZ2xlIHRpbGUgdmlzaXRlZApgYGB7cn0KCmRmX3VzX3NvY2Rpc3QgJT4lIHNhbXBsZV9uKDEwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIG11dGF0ZShkaXN0X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjA1LCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGUoLltbaV1dLCAwLjk1LCBuYS5ybSA9IFQpLCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihkaXN0X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5kaXN0X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CmBgYAoKYGBge3J9CgpkZl91c19zb2NkaXN0ICU+JSBzYW1wbGVfbigxMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF90aWxlcykpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUoZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4wNSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlKC5bW2ldXSwgMC45NSwgbmEucm0gPSBUKSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIoZGlzdF90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3RpbGVzKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+ZGlzdF90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgpgYGB7cn0KCmRmX3VzX3NvY2Rpc3QgJT4lIHNhbXBsZV9uKDEwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3RpbGVzX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIG11dGF0ZShkaXN0X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjA1LCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGUoLltbaV1dLCAwLjk1LCBuYS5ybSA9IFQpLCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihkaXN0X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3RfdGlsZXNfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5kaXN0X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCgpgYGB7cn0KCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuLAogICAgICAgICBzb2NkaXN0X3RpbGVzID0gc29jZGlzdF90aWxlc19jbGVhbikgJT4lIAogIHNlbGVjdCgtbG9lc3MsIC1sb2Vzc18yLCAtc29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbiwgLXNvY2Rpc3RfdGlsZXNfY2xlYW4pCmBgYAoKIyMjIENvcnJlbGF0aW9ucyAKYGBge3J9CgpkZl91c19wcmV2ICU+JSBzZWxlY3QoLXRpbWUsIC1kYXRlKSAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JQogIHN1bW1hcml6ZV9pZihpcy5udW1lcmljLCBtZWFuKSAlPiUgCiAgc2VsZWN0KC1jb3VudHlfZmlwcykgJT4lCiAgY29yKHVzZT0ncGFpcndpc2UuY29tcGxldGUub2JzJykgJT4lIAogIHJvdW5kKDMpICU+JSBhcy5kYXRhLmZyYW1lKCkKCmRmX3VzX3NvY2Rpc3QgJT4lIHNlbGVjdCgtdGltZSwgLWRhdGUpICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWNvdW50eV9maXBzKSAlPiUKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZS5vYnMnKSAlPiUgCiAgcm91bmQoMykgJT4lIGFzLmRhdGEuZnJhbWUoKQogIApgYGAKCiMjIyBSZXNjYWxlIERhdGEKYGBge3J9CgpsdmwyX3NjYWxlZCA8LSBkZl91c19wcmV2ICU+JSAKICBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtcmF0ZV9kYXkpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGVfYXQodmFycygtY291bnR5X2ZpcHMpLCBzY2FsZSkKCmx2bDFfc2NhbGVkIDwtIGRmX3VzX3ByZXYgJT4lIHNlbGVjdChjb3VudHlfZmlwcywgdGltZSwgcmF0ZV9kYXkpCgpkZl91c19wcmV2X3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkLCBsdmwyX3NjYWxlZCwgYnkgPSAnY291bnR5X2ZpcHMnKSAKCmBgYAoKYGBge3J9CgpsdmwyX3NjYWxlZCA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtc29jZGlzdF90aWxlcywgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGVfYXQodmFycygtY291bnR5X2ZpcHMpLCBzY2FsZSkKCmx2bDFfc2NhbGVkIDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIHNlbGVjdChjb3VudHlfZmlwcywgdGltZSwgc29jZGlzdF9zaW5nbGVfdGlsZSwgc29jZGlzdF90aWxlcykKCmRmX3VzX3NvY2Rpc3Rfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWQsIGx2bDJfc2NhbGVkLCBieSA9ICdjb3VudHlfZmlwcycpIAoKYGBgCgojIFByZWRpY3QgUHJldmFsZW5jZQojIyMgRXh0cmFjdCBmaXJzdCBkYXkgb2YgY292aWQgb3V0YnJlYWsKYGBge3J9CgojIGdldCBvbnNldCBkYXkKZGZfdXNfb25zZXRfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUocmF0ZV9jcyA9IGN1bXN1bShyYXRlX2RheSkpICU+JSAKICBmaWx0ZXIocmF0ZV9jcyA+IDApICU+JQogIHN1bW1hcml6ZShvbnNldF9wcmV2ID0gbWluKHRpbWUpKSAlPiUKICBtdXRhdGUoY291bnR5X2ZpcHMgPSBhcy5jaGFyYWN0ZXIoY291bnR5X2ZpcHMpKQogIAojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfb25zZXRfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpICU+JQogIGxlZnRfam9pbihkZl91c19vbnNldF9wcmV2LCBieSA9ICdjb3VudHlfZmlwcycpCgojIGhhbmRsZSBjZW5zb3JlZCBkYXRhCmRmX3VzX29uc2V0X3ByZXYgPC0gZGZfdXNfb25zZXRfcHJldiAlPiUgCiAgbXV0YXRlKGV2ZW50ID0gaWZlbHNlKGlzLm5hKG9uc2V0X3ByZXYpLCAwLCAxKSkgJT4lIAogIG11dGF0ZShvbnNldF9wcmV2ID0gcmVwbGFjZV9uYShvbnNldF9wcmV2LCBhcy5udW1lcmljKGRpZmYocmFuZ2UoZGZfdXNfcHJldiRkYXRlKSkpKzEpKQoKYGBgCgojIyMgRXh0cmFjdCBzbG9wZXMKYGBge3J9CgojIGN1dCB0aW1lIHNlcmllcyBiZWZvcmUgb25zZXQKZGZfdXNfcHJldl9zY2FsZWQgPC0gZGZfdXNfcHJldl9zY2FsZWQgJT4lIAogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgbXV0YXRlKHJhdGVfY3MgPSBjdW1zdW0ocmF0ZV9kYXkpKSAlPiUgCiAgZmlsdGVyKHJhdGVfY3MgPiAwKSAlPiUKICBtdXRhdGUodGltZSA9IHRpbWUtbWluKHRpbWUpKzEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIodGltZSA8PSAzMCkgJT4lCiAgc2VsZWN0KC1yYXRlX2NzKQoKIyBkcm9wIGNvdW50aWVzIHdpdGggbGl0dGxlIGRhdGEKZGZfdXNfcHJldl9zY2FsZWQgPC0gZGZfdXNfcHJldl9zY2FsZWQgJT4lCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JQogIGZpbHRlcihuKCkgPT0gMzApICU+JQogIHVuZ3JvdXAoKQoKIyBleHRyYWN0IHNsb3BlIHByZXZhbGVuY2UKZGZfdXNfc2xvcGVfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgc3BsaXQoLiRjb3VudHlfZmlwcykgJT4lIAogIG1hcCh+IGxtKHJhdGVfZGF5IH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykgJT4lIAogIHJlbmFtZShzbG9wZV9wcmV2ID0gJy4nKQogIAojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfc2xvcGVfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oZGZfdXNfc2xvcGVfcHJldiwgYnkgPSAnY291bnR5X2ZpcHMnKSAlPiUKICBkcm9wX25hKCkKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfdXNfc2xvcGVfcHJldl9jZW5zIDwtIGRmX3VzX3Nsb3BlX3ByZXYgJT4lIAogIGZpbHRlcihzbG9wZV9wcmV2Pj0wKSAlPiUgCiAgbXV0YXRlKHNsb3BlX3ByZXYgPSBzY2FsZShzbG9wZV9wcmV2KSkKCiMgc3RhbmRhcmRpemUgc2xvcGVzCmRmX3VzX3Nsb3BlX3ByZXYgPC0gZGZfdXNfc2xvcGVfcHJldiAlPiUgCiAgbXV0YXRlKHNsb3BlX3ByZXYgPSBzY2FsZShzbG9wZV9wcmV2KSkKCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9ucwpgYGB7cn0KCmRmX3VzX29uc2V0X3ByZXYgJT4lIGdncGxvdChhZXMob25zZXRfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKZGZfdXNfc2xvcGVfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQpkZl91c19zbG9wZV9wcmV2X2NlbnMgJT4lIGdncGxvdChhZXMoc2xvcGVfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKZGZfdXNfc2xvcGVfcHJldiAlPiUgc2VsZWN0KHNsb3BlX3ByZXYpICU+JSBzdW1tYXJ5KCkKZGZfdXNfc2xvcGVfcHJldl9jZW5zICU+JSBzZWxlY3Qoc2xvcGVfcHJldikgJT4lIHN1bW1hcnkoKQoKYGBgCgojIyBQcmVkaWN0IENPVklEIG9uc2V0IHdpdGggdGltZS10by1ldmVudCByZWdyZXNzaW9uIApgYGB7cn0KCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5CmNveF9vbnNldF9wcmV2IDwtIGNveHBoKFN1cnYob25zZXRfcHJldiwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X29uc2V0X3ByZXZfY3RybCA8LSBjb3hwaChTdXJ2KG9uc2V0X3ByZXYsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19vbnNldF9wcmV2KQpjb3hfb25zZXRfcHJldl9jdHJsICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMgUHJlZGljdCBwcmV2YWxlbmNlIHNsb3BlcyB3aXRoIGxpbmVhciBtb2RlbHMKYGBge3J9CgojIHByZWRpY3Qgc2xvcGVzIGZyb20gcGVyc29uYWxpdHkKbG1fc2xvcGVfcHJldiA8LSBsbShzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2ICU+JSBzdW1tYXJ5KCkKbG1fc2xvcGVfcHJldiAlPiUgY29uZmludChsZXZlbD0wLjkpCgoKIyBwcmVkaWN0IHNsb3BlcyBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKbG1fc2xvcGVfcHJldl9jdHJsIDwtIGxtKHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMsCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2xvcGVfcHJldikKbG1fc2xvcGVfcHJldl9jdHJsICU+JSBzdW1tYXJ5KCkKbG1fc2xvcGVfcHJldl9jdHJsICU+JSBjb25maW50KGxldmVsPTAuOSkKCgpgYGAKCiMjIFByZWRpY3QgcHJldmFsZW5jZSBzbG9wZXMgd2l0aCBjZW5zb3JlZCByZWdyZXNzaW9uCmBgYHtyfQoKIyBwcmVkaWN0IHNsb3BlcyBmcm9tIHBlcnNvbmFsaXR5CnRvYml0X3Nsb3BlX3ByZXYgPC0gY2Vuc1JlZyhzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaW4oZGZfdXNfc2xvcGVfcHJldl9jZW5zJHNsb3BlX3ByZXYpLCByaWdodCA9IEluZiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zbG9wZV9wcmV2X2NlbnMpCnRvYml0X3Nsb3BlX3ByZXYgJT4lIHN1bW1hcnkoKQp0b2JpdF9zbG9wZV9wcmV2ICU+JSBjb25maW50KGxldmVsPTAuOSkKCiMgcHJlZGljdCBzbG9wZXMgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCnRvYml0X3Nsb3BlX3ByZXZfY3RybCA8LSBjZW5zUmVnKHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaW4oZGZfdXNfc2xvcGVfcHJldl9jZW5zJHNsb3BlX3ByZXYpLCByaWdodCA9IEluZiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zbG9wZV9wcmV2X2NlbnMpCnRvYml0X3Nsb3BlX3ByZXZfY3RybCAlPiUgc3VtbWFyeSgpCnRvYml0X3Nsb3BlX3ByZXZfY3RybCAlPiUgY29uZmludChsZXZlbD0wLjkpCgpgYGAKCiMjIyBDUkYgcHJlZGljdGluZyBzbG9wZXMKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX3Nsb3BlX3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2xvcGVfcHJldiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wIDwtIHZhcmltcChjcmZfc2xvcGVfcHJldiwgbnBlcm0gPSAxKQpjcmZfc2xvcGVfcHJldl92YXJpbXBfY29uZCA8LSB2YXJpbXAoY3JmX3Nsb3BlX3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wCmNyZl9zbG9wZV9wcmV2X3ZhcmltcCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfc2xvcGVfcHJldl92YXJpbXBfY29uZApjcmZfc2xvcGVfcHJldl92YXJpbXBfY29uZCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMjIFByZWRpY3QgU29jaWFsIERpc3RhbmNpbmcKIyMjIENoYW5nZSBwb2ludCBhbmFseXNpcwpgYGB7cn0KCiMga2VlcCBvbmx5IGNvdW50aWVzIHdpdGggZnVsbCBkYXRhCmZpcHNfY29tcGxldGUgPC0gZGZfdXNfc29jZGlzdF9zY2FsZWQgJT4lIAogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgc3VtbWFyaXplKG4gPSBuKCkpICU+JSAKICBmaWx0ZXIobj09bWF4KC4kbikpICU+JSAKICAuJGNvdW50eV9maXBzCgojIHJ1biBjaGFuZ2Vwb2ludCBhbmFseXNpcwpkZl91c19zb2NkaXN0X2NwdF9yZXN1bHRzIDwtIGRmX3VzX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBzZWxlY3QoY291bnR5X2ZpcHMsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpICU+JQogIGZpbHRlcihjb3VudHlfZmlwcyAlaW4lIGZpcHNfY29tcGxldGUpICU+JSAKICBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUKICBtYXAofiBjcHQubWVhbnZhcihhcy52ZWN0b3IoLiRzb2NkaXN0X3NpbmdsZV90aWxlKSwKICAgICAgICAgICAgICAgICAgICAjcGVuYWx0eSA9ICdBc3ltcHRvdGljJywKICAgICAgICAgICAgICAgICAgICBjbGFzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIHBhcmFtLmVzdGltYXRlcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIFE9MSwKICAgICAgICAgICAgICAgICAgICB0ZXN0LnN0YXQgPSAnTm9ybWFsJykpCgpkZl91c19zb2NkaXN0X2NwdF9yZXN1bHRzXzIgPC0gZGZfdXNfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdChjb3VudHlfZmlwcywgc29jZGlzdF90aWxlcykgJT4lCiAgZmlsdGVyKGNvdW50eV9maXBzICVpbiUgZmlwc19jb21wbGV0ZSkgJT4lIAogIHNwbGl0KC4kY291bnR5X2ZpcHMpICU+JQogIG1hcCh+IGNwdC5tZWFudmFyKGFzLnZlY3RvciguJHNvY2Rpc3RfdGlsZXMpLAogICAgICAgICAgICAgICAgICAgICNwZW5hbHR5ID0gJ0FzeW1wdG90aWMnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgcGFyYW0uZXN0aW1hdGVzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgUT0xLAogICAgICAgICAgICAgICAgICAgIHRlc3Quc3RhdCA9ICdOb3JtYWwnKSkKCiMgY2FsY3VsYXRlIGNoYW5nZSBwb2ludApkZl91c19zb2NkaXN0X2NwdF9kYXkgPC0gZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKGNwdHMpICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUoY3B0X2RheV9zb2NkaXN0ID0gJy4nKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykKCmRmX3VzX3NvY2Rpc3RfY3B0X2RheV8yIDwtIGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHNfMiAlPiUgCiAgbWFwKGNwdHMpICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUoY3B0X2RheV9zb2NkaXN0XzIgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbignY291bnR5X2ZpcHMnKQoKIyBjYWxjdWxhdGUgbWVhbiBkaWZmZXJlbmNlcwpkZl91c19zb2NkaXN0X2NwdF9tZWFuX2RpZmYgPC0gZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKHBhcmFtLmVzdCkgJT4lIAogIG1hcCh+IC4kbWVhbikgJT4lIAogIG1hcCh+IC5bMl0tLlsxXSkgJT4lIAogIHVubGlzdCgpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJlbmFtZShtZWFuX2RpZmZfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdjb3VudHlfZmlwcycpCgpkZl91c19zb2NkaXN0X2NwdF9tZWFuX2RpZmZfMiA8LSBkZl91c19zb2NkaXN0X2NwdF9yZXN1bHRzXzIgJT4lIAogIG1hcChwYXJhbS5lc3QpICU+JSAKICBtYXAofiAuJG1lYW4pICU+JSAKICBtYXAofiAuWzFdLS5bMl0pICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUobWVhbl9kaWZmX3NvY2Rpc3RfMiA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdjb3VudHlfZmlwcycpCgojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfY3B0X3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdCgtdGltZSwgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUsIC1zb2NkaXN0X3RpbGVzKSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBsZWZ0X2pvaW4oZGZfdXNfc29jZGlzdF9jcHRfZGF5LCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfdXNfc29jZGlzdF9jcHRfZGF5XzIsIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9tZWFuX2RpZmYsIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9tZWFuX2RpZmZfMiwgYnk9J2NvdW50eV9maXBzJykgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChkZl91c19vbnNldF9wcmV2LCBjb3VudHlfZmlwcywgb25zZXRfcHJldiksIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihzZWxlY3QoZGZfdXNfc2xvcGVfcHJldiwgY291bnR5X2ZpcHMsIHNsb3BlX3ByZXYpLCBieT0nY291bnR5X2ZpcHMnKSAKCiMgc3RhbmRhcmRpemUgbWVhbi92YXIgZGlmZmVyZW5jZXMKZGZfdXNfY3B0X3NvY2Rpc3QgPC0gZGZfdXNfY3B0X3NvY2Rpc3QgJT4lIAogIG11dGF0ZShtZWFuX2RpZmZfc29jZGlzdCA9IHNjYWxlKG1lYW5fZGlmZl9zb2NkaXN0KSwKICAgICAgICAgbWVhbl9kaWZmX3NvY2Rpc3RfMiA9IHNjYWxlKG1lYW5fZGlmZl9zb2NkaXN0XzIpKQoKIyBoYW5kbGUgY2Vuc29yZWQgZGF0YQpkZl91c19jcHRfc29jZGlzdCA8LSBkZl91c19jcHRfc29jZGlzdCAlPiUgCiAgbXV0YXRlKGNwdF9kYXlfc29jZGlzdCA9IGlmZWxzZShpcy5uYShjcHRfZGF5X3NvY2Rpc3QpLCBhcy5udW1lcmljKGRpZmYocmFuZ2UoZGZfdXNfc29jZGlzdCRkYXRlKSkpLCBjcHRfZGF5X3NvY2Rpc3QpKSAlPiUgCiAgbXV0YXRlKGV2ZW50ID0gaWZlbHNlKGNwdF9kYXlfc29jZGlzdCA+PSBhcy5udW1lcmljKGRpZmYocmFuZ2UoZGZfdXNfc29jZGlzdCRkYXRlKSkpLCAwLCAxKSkKCmBgYAoKCmBgYHtyfQpkZl91c19jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3QgJT4lIGhpc3QoKQpkZl91c19jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdCAlPiUgaGlzdCgpCgpkZl91c19jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3RfMiAlPiUgaGlzdCgpCmRmX3VzX2NwdF9zb2NkaXN0JG1lYW5fZGlmZl9zb2NkaXN0XzIgJT4lIGhpc3QoKQoKYGBgCgpgYGB7cn0KCmZvcihpIGluIGhlYWQoZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cywgNSkpewogIHBsb3QoaSkKfQoKYGBgCgpgYGB7cn0KCmZvcihpIGluIGhlYWQoZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0c18yLCA1KSl7CiAgcGxvdChpKQp9CgpgYGAKCiMgUHJlZGljdGluZyBjaGFuZ2UgcG9pbnRzIHdpdGggdGltZS10by1ldmVudCByZWdyZXNzaW9uIApgYGB7cn0KCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eQpjb3hfY3B0X3NvY2Rpc3QgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3QsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdCAlPiUgc3VtbWFyeSgpCgojIHByZWRpY3QgaGF6YXJkIGZyb20gcGVyc29uYWxpdHkgd2l0aCBjb250cm9scwpjb3hfY3B0X3NvY2Rpc3RfY3RybCA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdCwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2ICwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0KQpjb3hfY3B0X3NvY2Rpc3RfY3RybCAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIyBMaW5lYXIgbW9kZWxzIHByZWRpY3RpbmcgbWVhbiBkaWZmZXJlbmNlcwpgYGB7cn0KCmxtX21lYW5kaWZmX3NvY2Rpc3QgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0ICU+JSBjb25maW50KGxldmVsPTAuOSkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybCA8LSBsbShtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiArIHNsb3BlX3ByZXYgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0KQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKCmBgYAoKIyMjIENSRiBwcmVkaWN0aW5nIG1lYW4gZGlmZmVyZW5jZQpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfbWVhbmRpZmZfc29jZGlzdCA8LSBjZm9yZXN0KG1lYW5fZGlmZl9zb2NkaXN0IH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wIDwtIHZhcmltcChjcmZfbWVhbmRpZmZfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3QsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcF9jb25kCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcF9jb25kICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIFByZWRpY3RpbmcgY2hhbmdlIHBvaW50cyB3aXRoIHRpbWUtdG8tZXZlbnQgcmVncmVzc2lvbiAKYGBge3J9CgojIHByZWRpY3QgaGF6YXJkIGZyb20gcGVyc29uYWxpdHkKY294X2NwdF9zb2NkaXN0XzIgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3RfMiwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0XzIgJT4lIHN1bW1hcnkoKQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X2NwdF9zb2NkaXN0X2N0cmxfMiA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdF8yLCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiArIHNsb3BlX3ByZXYgLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdF9jdHJsXzIgJT4lIHN1bW1hcnkoKQoKYGBgCgojIyMgTGluZWFyIG1vZGVscyBwcmVkaWN0aW5nIG1lYW4gZGlmZmVyZW5jZXMKYGBge3J9CgpsbV9tZWFuZGlmZl9zb2NkaXN0XzIgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3RfMiB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF8yICU+JSBzdW1tYXJ5KCkKbG1fbWVhbmRpZmZfc29jZGlzdF8yICU+JSBjb25maW50KGxldmVsPTAuOSkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybF8yIDwtIGxtKG1lYW5fZGlmZl9zb2NkaXN0XzIgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2ICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsXzIgJT4lIHN1bW1hcnkoKQpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMiAlPiUgY29uZmludChsZXZlbD0wLjkpCgoKYGBgCgojIyMgQ1JGIHByZWRpY3RpbmcgbWVhbiBkaWZmZXJlbmNlCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0XzIgPC0gY2ZvcmVzdChtZWFuX2RpZmZfc29jZGlzdF8yIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wIDwtIHZhcmltcChjcmZfbWVhbmRpZmZfc29jZGlzdF8yLCBucGVybSA9IDEpCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcF9jb25kIDwtIHZhcmltcChjcmZfbWVhbmRpZmZfc29jZGlzdF8yLCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyMjIEV4cG9ydCBkYXRhIApgYGB7cn0KdXNfbGlzdF9yZXN1bHRzIDwtIGxpc3QoY294X29uc2V0X3ByZXYsIGNveF9vbnNldF9wcmV2X2N0cmwsIAogICAgIGxtX3Nsb3BlX3ByZXYsIGxtX3Nsb3BlX3ByZXZfY3RybCwgCiAgICAgY294X2NwdF9zb2NkaXN0LCBjb3hfY3B0X3NvY2Rpc3RfY3RybCwKICAgICBsbV9tZWFuZGlmZl9zb2NkaXN0LCBsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwsCiAgICAgY294X2NwdF9zb2NkaXN0XzIsIGNveF9jcHRfc29jZGlzdF9jdHJsXzIsCiAgICAgbG1fbWVhbmRpZmZfc29jZGlzdF8yLCBsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMikKCnJlc3VsdHNfbmFtZXMgPC0gbGlzdCgnY294X29uc2V0X3ByZXYnLCAnY294X29uc2V0X3ByZXZfY3RybCcsIAogICAgICdsbV9zbG9wZV9wcmV2JywgJ2xtX3Nsb3BlX3ByZXZfY3RybCcsIAogICAgICdjb3hfY3B0X3NvY2Rpc3QnLCAnY294X2NwdF9zb2NkaXN0X2N0cmwnLCAKICAgICAnbG1fbWVhbmRpZmZfc29jZGlzdCcsICdsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwnLAogICAgICdjb3hfY3B0X3NvY2Rpc3RfMicsICdjb3hfY3B0X3NvY2Rpc3RfY3RybF8yJywKICAgICAnbG1fbWVhbmRpZmZfc29jZGlzdF8yJywgJ2xtX21lYW5kaWZmX3NvY2Rpc3RfY3RybF8yJykKCm5hbWVzKHVzX2xpc3RfcmVzdWx0cykgPC0gcmVzdWx0c19uYW1lcwoKc2F2ZSh1c19saXN0X3Jlc3VsdHMsIGZpbGU9InVzX2xpc3RfcmVzdWx0cy5SRGF0YSIpCgpgYGAKCmBgYHtyfQp3cml0ZV9jc3YoZGZfdXNfc2xvcGVfcHJldiwgJy9Vc2Vycy9ocDI1MDAvR29vZ2xlIERyaXZlL1NUVURZL0NvbHVtYmlhL1Jlc2VhcmNoL0Nvcm9uYS9EZWxpdmVyeS9kZl91c19zbG9wZV9wcmV2LmNzdicpCndyaXRlX2NzdihkZl91c19jcHRfc29jZGlzdCwgJy9Vc2Vycy9ocDI1MDAvR29vZ2xlIERyaXZlL1NUVURZL0NvbHVtYmlhL1Jlc2VhcmNoL0Nvcm9uYS9EZWxpdmVyeS9kZl91c19jcHRfc29jZGlzdC5jc3YnKQoKYGBgCgo=